package ar.edu.utn.frsf.tpae.a2012.g03.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import ar.edu.utn.frsf.tpae.a2012.g03.dao.PagosDAO;
import ar.edu.utn.frsf.tpae.a2012.g03.model.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g03.model.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g03.model.MovimientoPago;

public class PagosHibernateDAO implements PagosDAO {
	
	private SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

	@Override
	public int getCantidadPagos() {
		Session session = null;
		List<Movimiento> cuentas = new ArrayList<Movimiento>();
		try{
			 session = sessionFactory.openSession();
			 Query query = session.createQuery("from " + Movimiento.class.getName());

			 cuentas = (List<Movimiento>) query.list();
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
		
		return cuentas.size();
	}

	public int getCantidadMovPagos() {
		Session session = null;
		List<MovimientoPago> cuentas = new ArrayList<MovimientoPago>();
		try{
			 session = sessionFactory.openSession();
			 Query query = session.createQuery("from " + MovimientoPago.class.getName());

			 cuentas = (List<MovimientoPago>) query.list();
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
		
		return cuentas.size();
	}
	@Override
	public void realizarPago(double importe, Cuenta unaCuenta) {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		double saldoRestante = unaCuenta.getCtaSdoAct() - importe;
		unaCuenta.setCtaSdoAct(saldoRestante);
		Movimiento pago = new Movimiento(2, new Date(), importe, unaCuenta);
		unaCuenta.getMovList().add(pago);
		session.saveOrUpdate(unaCuenta);
		session.getTransaction().commit();
		session.close();		
	}

	@Override
	public void realizarPago(double importe, Cuenta unaCuenta, String comentario, String codigo) {
		Session session = sessionFactory.openSession();
		try{
		
		session.beginTransaction();
		double saldoRestante = unaCuenta.getCtaSdoAct() - importe;
		unaCuenta.setCtaSdoAct(saldoRestante);
		MovimientoPago movPago = new MovimientoPago(1,codigo,comentario);
		Movimiento pago = new Movimiento(1, new Date(), importe, movPago, unaCuenta);
		pago.getMovPag().setMov(pago);
		unaCuenta.getMovList().add(pago);
		session.saveOrUpdate(unaCuenta);
		//session.persist(pago);
		session.getTransaction().commit();
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
		finally{
		session.close();
		}
	}

}
